﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using System.Diagnostics;

namespace l1cs.server.model.monitor
{
    /// <summary>
    /// L1PcInstanceの定期処理、監視処理等を行う為の共通的な処理を実装した抽象クラス
    /// 
    /// 各タスク処理は{@link #run()}ではなく{@link #execTask(L1PcInstance)}にて実装する。
    /// PCがログアウトするなどしてサーバ上に存在しなくなった場合、run()メソッドでは即座にリターンする。
    /// その場合、タスクが定期実行スケジューリングされていたら、ログアウト処理等でスケジューリングを停止する必要がある。
    /// 停止しなければタスクは止まらず、永遠に定期実行されることになる。
    /// 定期実行でなく単発アクションの場合はそのような制御は不要。
    /// 
    /// L1PcInstanceの参照を直接持つことは望ましくない。
    /// </summary>
    public abstract class L1PcMonitor
    {
        /** モニター対象L1PcInstanceのオブジェクトID */
        protected int _id;

        /**
         * 指定されたパラメータでL1PcInstanceに対するモニターを作成する。
         * @param oId {@link L1PcInstance#getId()}で取得できるオブジェクトID
         */
        public L1PcMonitor( int oId )
        {
            _id = oId;
        }

        public void run( object state )
        {
            L1PcInstance pc = (L1PcInstance)L1World.getInstance().findObject( _id );
            if ( pc == null || pc.getNetConnection() == null )
            {
                Debug.WriteLine(DateTime.Now.ToString() + "L1PcMonitor run return");
                return;
            }
            execTask( pc );
        }

        /**
         * タスク実行時の処理
         * @param pc モニター対象のPC
         */
        public abstract void execTask( L1PcInstance pc );
    }
}
